package cn.yunbamboos.token;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import java.util.function.BiConsumer;

/**
 * token接口
 */
public interface IToken {

    /**
     * 生成唯一ID 用户缓存的key
     *
     * @return 生成唯一ID
     */
    String toID();

    /**
     * 设置自定义属性
     *
     * @param key   自定义属性的key
     * @param value 自定义属性的value
     */
    void set(String key, Object value);

    /**
     * 获取自定义属性(string)
     *
     * @param key 自定义属性的key
     * @return 自定义属性的value(string)
     */
    String getString(String key);

    void forEach(BiConsumer<String, Object> action);

    /**
     * 获取自定义属性(int)
     *
     * @param key 自定义属性的key
     * @return 自定义属性的value(int)
     */
    int getInteger(String key);

    /**
     * 获取自定义属性(JSONObject)
     *
     * @param key 自定义属性的key
     * @return 自定义属性的value(JSONObject)
     */
    JSONObject getJSONObject(String key);

    /**
     * 获取自定义属性(JSONArray)
     *
     * @param key 自定义属性的key
     * @return 自定义属性的value(JSONArray)
     */
    JSONArray getJSONArray(String key);

    /**
     * 生成token字符串
     *
     * @return token字符串
     */
    String create();

    /**
     * 解析token字符串
     *
     * @param tokenStr token字符串
     */
    void parse(String tokenStr);

    /**
     * 构建token
     */
    interface Builder {
        /**
         * 设置ID
         *
         * @param id token id
         * @return {@code IToken.Builder}
         */
        Builder id(String id);

        /**
         * 设置请求IP
         *
         * @param ip 请求IP
         * @return {@code IToken.Builder}
         */
        Builder ip(String ip);

        /**
         * 设置请求浏览器
         *
         * @param browser 请求浏览器
         * @return {@code IToken.Builder}
         */
        Builder browser(String browser);

        /**
         * 设置自定义属性
         *
         * @param key   属性key
         * @param value 属性value
         * @return {@code IToken.Builder}
         */
        Builder set(String key, Object value);

        /**
         * 设置签名
         *
         * @param secret 签名
         * @return {@code IToken.Builder}
         */
        Builder secret(String secret);

        /**
         * 设置签发者
         *
         * @param issuer 签发者
         * @return {@code IToken.Builder}
         */
        Builder issuer(String issuer);

        /**
         * 设置创建时间
         *
         * @param createTime 创建时间
         * @return {@code IToken.Builder}
         */
        Builder createTime(long createTime);

        /**
         * 设置失效时间
         *
         * @param expireTime 失效时间
         * @return {@code IToken.Builder}
         */
        Builder expireTime(long expireTime);

        /**
         * 创建token
         *
         * @return {@code IToken}
         */
        IToken build();

        /**
         * 创建token
         *
         * @param str    token字符串
         * @param secret 签名
         * @return {@code IToken}
         */
        IToken parse(String str, String secret);
    }
}
